package http

import (
	"StudentClient/protos"
	"golang.org/x/net/context"
	"log"
	"net/http"
	"strconv"
	"time"
)

func findOneHandler(ctx *RPCContext) {
	strId := ctx.Param("id")
	id, err := strconv.Atoi(strId)
	if err != nil {
		log.Println(err.Error())
		ctx.JSON(http.StatusOK, err.Error())
		return
	}
	resp, err := ctx.stuClient.FindOne(context.Background(), &protos.FindOneRequest{Id: int32(id)})
	if err != nil {
		log.Println(err.Error())
		ctx.JSON(http.StatusOK, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp.Student)
}

func listAllHandler(ctx *RPCContext) {
	con, _ := context.WithDeadline(context.Background(), time.Now().Add(time.Second * 5))

	resp, err := ctx.stuClient.ListAll(con, &protos.ListAllRequest{})
	if err != nil {
		log.Println(err.Error())
		ctx.JSON(http.StatusOK, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp.Students)
}

func addHandler(ctx *RPCContext) {
	var stu protos.Student
	err := ctx.ShouldBindJSON(&stu)
	if err != nil {
		log.Println(err.Error())
		ctx.JSON(http.StatusOK, err.Error())
		return
	}

	resp, err := ctx.stuClient.Add(context.Background(), &protos.AddRequest{Student: &stu})
	if err != nil {
		log.Println(err.Error())
		ctx.JSON(http.StatusOK, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp)
}

func updateHandler(ctx *RPCContext) {
	var stu protos.Student
	err := ctx.ShouldBindJSON(&stu)
	if err != nil {
		log.Println(err.Error())
		ctx.JSON(http.StatusOK, err.Error())
		return
	}

	resp, err := ctx.stuClient.Update(context.Background(), &protos.UpdateRequest{Student: &stu})
	if err != nil {
		log.Println(err.Error())
		ctx.JSON(http.StatusOK, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp)
}

func deleteHandler(ctx *RPCContext) {
	strId := ctx.Param("id")
	id, err := strconv.Atoi(strId)
	if err != nil {
		log.Println(err.Error())
		ctx.JSON(http.StatusOK, err.Error())
		return
	}
	resp, err := ctx.stuClient.Delete(context.Background(), &protos.DeleteRequest{Id: int32(id)})
	if err != nil {
		log.Println(err.Error())
		ctx.JSON(http.StatusOK, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp)
}
